//权限文件
// 引入仓库
import store from "@/store";
// 引入路由
import router from "@/router";

//引入进度条
import NProgress from "nprogress";
NProgress.configure({ showSpinner: false }); // NProgress Configuration
import "nprogress/nprogress.css";
// 跳转白名单
let whiteList = ["/login", "/404"];

//路由前置守卫
router.beforeEach(async (to, from, next) => {
	// 开启进度条
	NProgress.start();
	// 1.获取token
	const token = store.getters.token;
	// 2.是否有token
	if (!!token) {
		// 有token
		// 3.有token是否去登录页面
		// 去登录页
		if (to.path === "/login") {
			next("/");
			NProgress.done();
		} else {
			//不去登录页面
			// 4.是否有用户信息
			//
			const isGetUserInfo = store.state.permission.isGetUserInfo;
			if (isGetUserInfo) {
				// 有用户信息，直接放行
				next();
			} else {
				// 没有用户信息，尝试去获取
				try {
					// 尝试去获取用户信息
					await store.dispatch("user/$_UserInfo");
					// 拿到角色信息
					const role = store.state.user.role;
					// 获取可以被循环添加的动态路由
					let accessRoutes =await store.dispatch(
						"permission/generateRoutes",
						role
					);
					// 循环添加动态路由
					accessRoutes.forEach((route) => {
						router.addRoute(route);
					});
					// 设置用户状态为true
					store.commit("permission/SET_USERINFO_STATE", true);
					//hack方法 无线向下跳转 保证路由添加成功
					//replace true 路由历史栈里面不会保存路由 为了防止后退
					next({ ...to, replace: true });
				} catch (error) {
                    console.log(error);
					//等待清空用户信息
					await store.dispatch("user/$_Clear");
					next(`/login?redirect=${to.path}`);
				}
			}
		}
	} else {
		// 无token
		// 是否去白名单
		// 去
		if (whiteList.includes(to.path)) {
			next();
		} else {
			// 不去白名单
			// 就跳转到登录页面 携带去的地址
			next(`/login?redirect=${to.path}`);
			// 关闭进度条
			NProgress.done();
		}
	}
});

// 路由后置守卫
router.afterEach(() => {
	//关闭进度条
	NProgress.done();
});
